import SSA.Core.WellTypedFramework import SSA.Projects.InstCombine.InstCombineBase open SSA InstCombine -- Name:AddSub:1043 -- precondition: true /- %Y = and %Z, C1 %X = xor %Y, C1 %LHS = add %X, 1 %r = add %LHS, %RHS => %or = or %Z, ~C1 %Y = and %Z, C1 %X = xor %Y, C1 %LHS = add %X, 1 %r = sub %RHS, %or -/ open SSA EDSL in : forall (w :w: โNat) (Nat: TypeZZ: โC1C1: โRHSRHS: โZZ: โC1C1: โRHS :RHS: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4052TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โZ)) %v9999; %v2 := op:const (Bitvec.ofInt'Z: โw (w: โC1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andC1: โw %v3; %v5 := pair:%v4 %v2; %v6 := op:xorw: โw %v5; %v7 := op:const (Bitvec.ofInt'w: โw (w: โ1)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:add1: ?m.5048w %v8; %v10 := op:const (Bitvec.ofInt'w: โw (w: โRHS)) %v9999; %v11 := pair:%v9 %v10; %v12 := op:addRHS: โw %v11 dsl_ret %v12 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4052TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โZ)) %v9999; %v2 := op:const (Bitvec.ofInt'Z: โw (w: โC1)) %v9999; %v3 := op:notC1: โw %v2; %v4 := pair:%v1 %v3; %v5 := op:orw: โw %v4; %v6 := pair:%v1 %v2; %v7 := op:andw: โw %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := op:const (Bitvec.ofInt'w: โw (w: โ1)) %v9999; %v11 := pair:%v9 %v10; %v12 := op:add1: ?m.8840w %v11; %v13 := op:const (Bitvec.ofInt'w: โw (w: โRHS)) %v9999; %v14 := pair:%v13 %v5; %v15 := op:subRHS: โw %v14 dsl_ret %v15 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS')) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ')) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS')) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ')) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' w โZ') let x_1 โ some (Bitvec.ofInt' w โC1) let x_2 โ some (Bitvec.ofInt' w โC1) let x_3 โ some (Bitvec.ofInt' w 1) let fst โ Bitvec.add? (Bitvec.xor (Bitvec.and x x_1) x_2) x_3 let snd โ some (Bitvec.ofInt' w โRHS') Bitvec.add? fst snd) = do let fst โ some (Bitvec.ofInt' w โRHS') let x โ some (Bitvec.ofInt' w โZ') let x_1 โ some (Bitvec.not (Bitvec.ofInt' w โC1)) pure (Bitvec.sub fst (Bitvec.or x x_1))โ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(Option.bind (Bitvec.add? (Bitvec.xor (Bitvec.and (Bitvec.ofInt' w โZ') (Bitvec.ofInt' w โC1)) (Bitvec.ofInt' w โC1)) (Bitvec.ofInt' w 1)) fun fst => Bitvec.add? fst (Bitvec.ofInt' w โRHS')) = some (Bitvec.sub (Bitvec.ofInt' w โRHS') (Bitvec.or (Bitvec.ofInt' w โZ') (Bitvec.not (Bitvec.ofInt' w โC1))))โ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1152 -- precondition: true /- %r = add i1 %x, %y => %r = xor %x, %y -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typexx: โyy: โxx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.248252TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addy: โw %v3 dsl_ret %v4 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.248252TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xory: โw %v3 dsl_ret %v4 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โyโ) Bitvec.add? fst snd) = do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โyโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ) = some (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1164 -- precondition: true /- %na = sub 0, %a %c = add %na, %b => %na = sub 0, %a %c = sub %b, %a -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โbb: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.317669TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.319264w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:addb: โw %v6 dsl_ret %v7 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.317669TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.321514w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:subb: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ 0) let x_1 โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.sub x x_1) snd) = do let fst โ some (Bitvec.ofInt' wโ โbโ) let snd โ some (Bitvec.ofInt' wโ โaโ) pure (Bitvec.sub fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ)) (Bitvec.ofInt' wโ โbโ) = some (Bitvec.sub (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ โaโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1165 -- precondition: true /- %na = sub 0, %a %nb = sub 0, %b %c = add %na, %nb => %ab = add %a, %b %na = sub 0, %a %nb = sub 0, %b %c = sub 0, %ab -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โbb: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.443697TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.446310w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := op:const (Bitvec.ofInt'0: ?m.444679w (w: โb)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:subb: โw %v7; %v9 := pair:%v4 %v8; %v10 := op:addw: โw %v9 dsl_ret %v10 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.443697TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:sub0: ?m.448583w %v6; %v8 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v9 := pair:%v8 %v2; %v10 := op:sub0: ?m.448080w %v9; %v11 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v12 := pair:%v11 %v4; %v13 := op:sub0: ?m.447535w %v12 dsl_ret %v13 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ 0) let x_1 โ some (Bitvec.ofInt' wโ โaโ) let x_2 โ some (Bitvec.ofInt' wโ 0) let x_3 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.sub x x_1) (Bitvec.sub x_2 x_3)) = do let fst โ some (Bitvec.ofInt' wโ 0) let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let snd โ Bitvec.add? x x_1 pure (Bitvec.sub fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ)) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โbโ)) = Option.bind (Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) fun snd => some (Bitvec.sub (Bitvec.ofInt' wโ 0) snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1176 -- precondition: true /- %nb = sub 0, %b %c = add %a, %nb => %nb = sub 0, %b %c = sub %a, %b -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typebb: โaa: โbb: โa :a: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.639137TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.640732w (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:adda: โw %v6 dsl_ret %v7 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.639137TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.642982w (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:suba: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โaโ) let x โ some (Bitvec.ofInt' wโ 0) let x_1 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? fst (Bitvec.sub x x_1)) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.sub fst snd)โ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โbโ)) = some (Bitvec.sub (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1295 -- precondition: true /- %aab = and %a, %b %aob = xor %a, %b %c = add %aab, %aob => %aab = and %a, %b %aob = xor %a, %b %c = or %a, %b -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โbb: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.764885TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.764885TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:orw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.and x x_1) (Bitvec.xor x_2 x_3)) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.or fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) = some (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1309 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add %a, %b -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โbb: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.923425TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.923425TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:addw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.and x x_1) (Bitvec.or x_2 x_3)) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? fst sndโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) = Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1309-2 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add nsw %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add nsw %a, %b -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โbb: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1080230TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1080230TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:addw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.and x x_1) (Bitvec.or x_2 x_3)) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? fst sndโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) = Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1309-3 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add nuw %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add nuw %a, %b -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โbb: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1237035TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1237035TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:addw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? (Bitvec.and x x_1) (Bitvec.or x_2 x_3)) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) Bitvec.add? fst sndโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) = Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1539 -- precondition: true /- %na = sub 0, %a %r = sub %x, %na => %na = sub 0, %a %r = add %x, %a -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โxx: โaa: โx :x: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1394089TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.1395684w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:subx: โw %v6 dsl_ret %v7 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1394089TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.1397934w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:addx: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โxโ) let x โ some (Bitvec.ofInt' wโ 0) let x_1 โ some (Bitvec.ofInt' wโ โaโ) pure (Bitvec.sub fst (Bitvec.sub x x_1))) = do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โaโ) Bitvec.add? fst sndโ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ โxโ) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ))) = Bitvec.add? (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โaโ)โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1546 -- precondition: true /- %na = sub nsw 0, %a %r = sub nsw %x, %na => %na = sub nsw 0, %a %r = add nsw %x, %a -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โxx: โaa: โx :x: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1520260TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.1521855w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:subx: โw %v6 dsl_ret %v7 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1520260TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.1524105w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:addx: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โxโ) let x โ some (Bitvec.ofInt' wโ 0) let x_1 โ some (Bitvec.ofInt' wโ โaโ) pure (Bitvec.sub fst (Bitvec.sub x x_1))) = do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โaโ) Bitvec.add? fst sndโ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ โxโ) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ))) = Bitvec.add? (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โaโ)โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1556 -- precondition: true /- %r = sub i1 %x, %y => %r = xor %x, %y -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typexx: โyy: โxx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1645418TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suby: โw %v3 dsl_ret %v4 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1645418TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xory: โw %v3 dsl_ret %v4 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โyโ) pure (Bitvec.sub fst snd)) = do let fst โ some (Bitvec.ofInt' wโ โxโ) let snd โ some (Bitvec.ofInt' wโ โyโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ)) = some (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1560 -- precondition: true /- %r = sub -1, %a => %r = xor %a, -1 -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โa :a: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1715764TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v2 := op:const (Bitvec.ofInt'1: ?m.1716337w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3 dsl_ret %v4 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1715764TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1717798w %v3 dsl_ret %v4 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ (-1)) let snd โ some (Bitvec.ofInt' wโ โaโ) pure (Bitvec.sub fst snd)) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ (-1)) (Bitvec.ofInt' wโ โaโ)) = some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1614 -- precondition: true /- %Op1 = add %X, %Y %r = sub %X, %Op1 => %Op1 = add %X, %Y %r = sub 0, %Y -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeXX: โYY: โXX: โY :Y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1812305TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addY: โw %v3; %v5 := pair:%v1 %v4; %v6 := op:subw: โw %v5 dsl_ret %v6 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1812305TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addY: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:sub0: ?m.1814452w %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โXโ) let x โ some (Bitvec.ofInt' wโ โXโ) let x_1 โ some (Bitvec.ofInt' wโ โYโ) let snd โ Bitvec.add? x x_1 pure (Bitvec.sub fst snd)) = do let fst โ some (Bitvec.ofInt' wโ 0) let snd โ some (Bitvec.ofInt' wโ โYโ) pure (Bitvec.sub fst snd)โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(Option.bind (Bitvec.add? (Bitvec.ofInt' wโ โXโ) (Bitvec.ofInt' wโ โYโ)) fun snd => some (Bitvec.sub (Bitvec.ofInt' wโ โXโ) snd)) = some (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โYโ))โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1619 -- precondition: true /- %Op0 = sub %X, %Y %r = sub %Op0, %X => %Op0 = sub %X, %Y %r = sub 0, %Y -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeXX: โYY: โXX: โY :Y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1939036TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subY: โw %v3; %v5 := pair:%v4 %v1; %v6 := op:subw: โw %v5 dsl_ret %v6 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1939036TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subY: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:sub0: ?m.1941183w %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โXโ) let x_1 โ some (Bitvec.ofInt' wโ โYโ) let snd โ some (Bitvec.ofInt' wโ โXโ) pure (Bitvec.sub (Bitvec.sub x x_1) snd)) = do let fst โ some (Bitvec.ofInt' wโ 0) let snd โ some (Bitvec.ofInt' wโ โYโ) pure (Bitvec.sub fst snd)โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.sub (Bitvec.ofInt' wโ โXโ) (Bitvec.ofInt' wโ โYโ)) (Bitvec.ofInt' wโ โXโ)) = some (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โYโ))โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1624 -- precondition: true /- %Op0 = or %A, %B %Op1 = xor %A, %B %r = sub %Op0, %Op1 => %Op0 = or %A, %B %Op1 = xor %A, %B %r = and %A, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2066143TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:subw: โw %v7 dsl_ret %v8 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2066143TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:andw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.sub (Bitvec.or x x_1) (Bitvec.xor x_2 x_3))) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.and fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) = some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1230 ~A & ~B -> ~(A | B) -- precondition: true /- %op0 = xor %notOp0, -1 %op1 = xor %notOp1, -1 %r = and %op0, %op1 => %or = or %notOp0, %notOp1 %op0 = xor %notOp0, -1 %op1 = xor %notOp1, -1 %r = xor %or, -1 -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypenotOp0notOp0: โnotOp1notOp1: โnotOp0notOp0: โnotOp1 :notOp1: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2227269TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnotOp0)) %v9999; %v2 := op:const (Bitvec.ofInt'notOp0: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2229545w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โnotOp1)) %v9999; %v6 := op:const (Bitvec.ofInt'notOp1: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.2228005w %v7; %v9 := pair:%v4 %v8; %v10 := op:andw: โw %v9 dsl_ret %v10 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2227269TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnotOp0)) %v9999; %v2 := op:const (Bitvec.ofInt'notOp0: โw (w: โnotOp1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:ornotOp1: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.2231986w %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v2 %v8; %v10 := op:xor1: ?m.2231461w %v9; %v11 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v12 := pair:%v4 %v11; %v13 := op:xor1: ?m.2230898w %v12 dsl_ret %v13 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โnotOp0โ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โnotOp1โ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and (Bitvec.xor x x_1) (Bitvec.xor x_2 x_3))) = do let x โ some (Bitvec.ofInt' wโ โnotOp0โ) let x_1 โ some (Bitvec.ofInt' wโ โnotOp1โ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.or x x_1) snd)โ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โnotOp0โ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โnotOp1โ) (Bitvec.ofInt' wโ (-1)))) = some (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โnotOp0โ) (Bitvec.ofInt' wโ โnotOp1โ)) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1241 (A|B) & ~(A&B) => A^B -- precondition: true /- %op0 = or %A, %B %notOp1 = and %A, %B %op1 = xor %notOp1, -1 %r = and %op0, %op1 => %op0 = or %A, %B %notOp1 = and %A, %B %op1 = xor %notOp1, -1 %r = xor %A, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2426273TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:andw: โw %v5; %v7 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:xor1: ?m.2427017w %v8; %v10 := pair:%v4 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2426273TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:andw: โw %v5; %v7 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:xor1: ?m.2430771w %v8; %v10 := pair:%v1 %v2; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ โBโ) let x_4 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and (Bitvec.or x x_1) (Bitvec.xor (Bitvec.and x_2 x_3) x_4))) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))) = some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1247 ~(A&B) & (A|B) => A^B -- precondition: true /- %notOp0 = and %A, %B %op0 = xor %notOp0, -1 %op1 = or %A, %B %r = and %op0, %op1 => %notOp0 = and %A, %B %op0 = xor %notOp0, -1 %op1 = or %A, %B %r = xor %A, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2632371TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.2633518w %v6; %v8 := pair:%v1 %v2; %v9 := op:orw: โw %v8; %v10 := pair:%v7 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2632371TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.2637201w %v6; %v8 := pair:%v1 %v2; %v9 := op:orw: โw %v8; %v10 := pair:%v1 %v2; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โAโ) let x_4 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.and (Bitvec.xor (Bitvec.and x x_1) x_2) (Bitvec.or x_3 x_4))) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1))) (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) = some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1253 A & (A^B) -> A & ~B -- precondition: true /- %op0 = xor %A, %B %r = and %op0, %A => %notB = xor %B, -1 %op0 = xor %A, %B %r = and %A, %notB -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2835586TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := pair:%v4 %v1; %v6 := op:andw: โw %v5 dsl_ret %v6 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2835586TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2838590w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:xorA: โw %v6; %v8 := pair:%v5 %v4; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let snd โ some (Bitvec.ofInt' wโ โAโ) pure (Bitvec.and (Bitvec.xor x x_1) snd)) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โBโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โAโ)) = some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1280 (~A|B)&A -> A&B -- precondition: true /- %nA = xor %A, -1 %op0 = or %nA, %B %r = and %op0, %A => %nA = xor %A, -1 %op0 = or %nA, %B %r = and %A, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2998502TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2999842w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:orB: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:andw: โw %v8 dsl_ret %v9 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2998502TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3002827w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:orB: โw %v6; %v8 := pair:%v1 %v5; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โBโ) let snd โ some (Bitvec.ofInt' wโ โAโ) pure (Bitvec.and (Bitvec.or (Bitvec.xor x x_1) x_2) snd)) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.and fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โAโ)) = some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1288 (A ^ B) & ((B ^ C) ^ A) -> (A ^ B) & ~C -- precondition: true /- %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = and %op0, %op1 => %op0 = xor %A, %B %negC = xor %C, -1 %x = xor %B, %C %op1 = xor %x, %A %r = and %op0, %negC -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โCC: โAA: โBB: โC :C: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3167870TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xorC: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3167870TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := op:const (Bitvec.ofInt'C: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.3172610w %v7; %v9 := pair:%v2 %v5; %v10 := op:xorw: โw %v9; %v11 := pair:%v10 %v1; %v12 := op:xorw: โw %v11; %v13 := pair:%v4 %v8; %v14 := op:andw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โBโ) let x_3 โ some (Bitvec.ofInt' wโ โCโ) let x_4 โ some (Bitvec.ofInt' wโ โAโ) pure (Bitvec.and (Bitvec.xor x x_1) (Bitvec.xor (Bitvec.xor x_2 x_3) x_4))) = do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โCโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and (Bitvec.xor x x_1) (Bitvec.xor x_2 x_3))โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ โCโ)) (Bitvec.ofInt' wโ โAโ))) = some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โCโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1294 (A | B) & ((~A) ^ B) -> (A & B) -- precondition: true /- %op0 = or %A, %B %x = xor %A, -1 %op1 = xor %x, %B %r = and %op0, %op1 => %op0 = or %A, %B %x = xor %A, -1 %op1 = xor %x, %B %r = and %A, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3438640TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.3439786w %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3438640TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.3443542w %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := pair:%v1 %v2; %v11 := op:andw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) let x_4 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.and (Bitvec.or x x_1) (Bitvec.xor (Bitvec.xor x_2 x_3) x_4))) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.and fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))) = some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2113 ((~A & B) | A) -> (A | B) -- precondition: true /- %negA = xor %A, -1 %op0 = and %negA, %B %r = or %op0, %A => %negA = xor %A, -1 %op0 = and %negA, %B %r = or %A, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3644160TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3645500w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:orw: โw %v8 dsl_ret %v9 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3644160TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3648485w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v1 %v5; %v9 := op:orw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โBโ) let snd โ some (Bitvec.ofInt' wโ โAโ) pure (Bitvec.or (Bitvec.and (Bitvec.xor x x_1) x_2) snd)) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โAโ)) = some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2118 ((A & B) | ~A) -> (~A | B) -- precondition: true /- %negA = xor %A, -1 %op0 = and %A, %B %r = or %op0, %negA => %negA = xor %A, -1 %op0 = and %A, %B %r = or %negA, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3813432TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3814772w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v7 %v4; %v9 := op:orw: โw %v8 dsl_ret %v9 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3813432TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3817757w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:orw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or (Bitvec.and x x_1) (Bitvec.xor x_2 x_3))) = do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or (Bitvec.xor x x_1) snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1)))) = some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2123 (A & (~B)) | (A ^ B) -> (A ^ B) -- precondition: true /- %negB = xor %B, -1 %op0 = and %A, %negB %op1 = xor %A, %B %r = or %op0, %op1 => %negB = xor %B, -1 %op0 = and %A, %negB %op1 = xor %A, %B %r = xor %A, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeBB: โAA: โBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3985722TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3987434w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:andA: โw %v6; %v8 := pair:%v5 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v7 %v9; %v11 := op:orw: โw %v10 dsl_ret %v11 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.3985722TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.3990759w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:andA: โw %v6; %v8 := pair:%v5 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v5 %v1; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โAโ) let x_4 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or (Bitvec.and x (Bitvec.xor x_1 x_2)) (Bitvec.xor x_3 x_4))) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) = some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2188 -- precondition: true /- %C = xor %D, -1 %B = xor %A, -1 %op0 = and %A, %C %op1 = and %B, %D %r = or %op0, %op1 => %C = xor %D, -1 %B = xor %A, -1 %op0 = and %A, %C %op1 = and %B, %D %r = xor %A, %D -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeDD: โAA: โDD: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4187175TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โD)) %v9999; %v2 := op:const (Bitvec.ofInt'D: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.4190249w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.4188715w %v7; %v9 := pair:%v5 %v4; %v10 := op:andw: โw %v9; %v11 := pair:%v8 %v1; %v12 := op:andw: โw %v11; %v13 := pair:%v10 %v12; %v14 := op:orw: โw %v13 dsl_ret %v14 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4187175TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โD)) %v9999; %v2 := op:const (Bitvec.ofInt'D: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.4194160w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.4192657w %v7; %v9 := pair:%v5 %v4; %v10 := op:andw: โw %v9; %v11 := pair:%v8 %v1; %v12 := op:andw: โw %v11; %v13 := pair:%v5 %v1; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โDโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โDโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โDโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โAโ) let x_4 โ some (Bitvec.ofInt' wโ (-1)) let x_5 โ some (Bitvec.ofInt' wโ โDโ) pure (Bitvec.or (Bitvec.and x (Bitvec.xor x_1 x_2)) (Bitvec.and (Bitvec.xor x_3 x_4) x_5))) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โDโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โDโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โDโ))) = some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โDโ))โ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2231 (A ^ B) | ((B ^ C) ^ A) -> (A ^ B) | C -- precondition: true /- %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = or %op0, %op1 => %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = or %op0, %C -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โCC: โAA: โBB: โC :C: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4430033TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xorC: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:orw: โw %v10 dsl_ret %v11 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4430033TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xorC: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v5; %v11 := op:orw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โBโ) let x_3 โ some (Bitvec.ofInt' wโ โCโ) let x_4 โ some (Bitvec.ofInt' wโ โAโ) pure (Bitvec.or (Bitvec.xor x x_1) (Bitvec.xor (Bitvec.xor x_2 x_3) x_4))) = do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let snd โ some (Bitvec.ofInt' wโ โCโ) pure (Bitvec.or (Bitvec.xor x x_1) snd)โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ โCโ)) (Bitvec.ofInt' wโ โAโ))) = some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โCโ))โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2243 ((B | C) & A) | B -> B | (A & C) -- precondition: true /- %o = or %B, %C %op0 = and %o, %A %r = or %op0, %B => %a = and %A, %C %o = or %B, %C %op0 = and %o, %A %r = or %B, %a -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeBB: โCC: โAA: โAA: โCC: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4637788TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (w: โC)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orC: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andA: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:orw: โw %v8 dsl_ret %v9 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4637788TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โC)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andC: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:orB: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:andw: โw %v8; %v10 := pair:%v5 %v4; %v11 := op:orw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โBโ) let x_1 โ some (Bitvec.ofInt' wโ โCโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or (Bitvec.and (Bitvec.or x x_1) x_2) snd)) = do let fst โ some (Bitvec.ofInt' wโ โBโ) let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โCโ) pure (Bitvec.or fst (Bitvec.and x x_1))โ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ โCโ)) (Bitvec.ofInt' wโ โAโ)) (Bitvec.ofInt' wโ โBโ)) = some (Bitvec.or (Bitvec.ofInt' wโ โBโ) (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โCโ)))โ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2247 (~A | ~B) == (~(A & B)) -- precondition: true /- %na = xor %A, -1 %nb = xor %B, -1 %r = or %na, %nb => %a = and %A, %B %na = xor %A, -1 %nb = xor %B, -1 %r = xor %a, -1 -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4836786TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.4839062w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.4837522w %v7; %v9 := pair:%v4 %v8; %v10 := op:orw: โw %v9 dsl_ret %v10 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4836786TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.4841503w %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v2 %v8; %v10 := op:xor1: ?m.4840978w %v9; %v11 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v12 := pair:%v4 %v11; %v13 := op:xor1: ?m.4840415w %v12 dsl_ret %v13 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โBโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or (Bitvec.xor x x_1) (Bitvec.xor x_2 x_3))) = do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.and x x_1) snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1)))) = some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2263 -- precondition: true /- %op1 = xor %op0, %B %r = or %op0, %op1 => %op1 = xor %op0, %B %r = or %op0, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeop0op0: โBB: โop0op0: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5033756TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โop0)) %v9999; %v2 := op:const (Bitvec.ofInt'op0: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := pair:%v1 %v4; %v6 := op:orw: โw %v5 dsl_ret %v6 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5033756TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โop0)) %v9999; %v2 := op:const (Bitvec.ofInt'op0: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5 dsl_ret %v6 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โop0โ) let x โ some (Bitvec.ofInt' wโ โop0โ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or fst (Bitvec.xor x x_1))) = do let fst โ some (Bitvec.ofInt' wโ โop0โ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or fst snd)โ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โop0โ) (Bitvec.xor (Bitvec.ofInt' wโ โop0โ) (Bitvec.ofInt' wโ โBโ))) = some (Bitvec.or (Bitvec.ofInt' wโ โop0โ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2264 -- precondition: true /- %na = xor %A, -1 %op1 = xor %na, %B %r = or %A, %op1 => %nb = xor %B, -1 %na = xor %A, -1 %op1 = xor %na, %B %r = or %A, %nb -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5160094TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.5161434w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xorB: โw %v6; %v8 := pair:%v1 %v7; %v9 := op:orw: โw %v8 dsl_ret %v9 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5160094TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.5165791w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.5164288w %v7; %v9 := pair:%v8 %v1; %v10 := op:xorw: โw %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or fst (Bitvec.xor (Bitvec.xor x x_1) x_2))) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โBโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))) = some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2265 -- precondition: true /- %op0 = and %A, %B %op1 = xor %A, %B %r = or %op0, %op1 => %op0 = and %A, %B %op1 = xor %A, %B %r = or %A, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5359281TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:orw: โw %v7 dsl_ret %v8 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5359281TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:orw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or (Bitvec.and x x_1) (Bitvec.xor x_2 x_3))) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or fst snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) = some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2284 -- precondition: true /- %o = or %A, %B %op1 = xor %o, -1 %r = or %A, %op1 => %not = xor %B, -1 %o = or %A, %B %op1 = xor %o, -1 %r = or %A, %not -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5520460TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.5521212w %v6; %v8 := pair:%v1 %v7; %v9 := op:orw: โw %v8 dsl_ret %v9 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5520460TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.5526436w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:orA: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.5524546w %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor (Bitvec.or x x_1) x_2))) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โBโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))) = some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2285 -- precondition: true /- %o = xor %A, %B %op1 = xor %o, -1 %r = or %A, %op1 => %not = xor %B, -1 %o = xor %A, %B %op1 = xor %o, -1 %r = or %A, %not -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5721130TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.5721882w %v6; %v8 := pair:%v1 %v7; %v9 := op:orw: โw %v8 dsl_ret %v9 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5721130TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.5727106w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:xorA: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.5725216w %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor (Bitvec.xor x x_1) x_2))) = do let fst โ some (Bitvec.ofInt' wโ โAโ) let x โ some (Bitvec.ofInt' wโ โBโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))) = some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2297 -- precondition: true /- %op0 = and %A, %B %na = xor %A, -1 %op1 = xor %na, %B %r = or %op0, %op1 => %na = xor %A, -1 %op0 = and %A, %B %op1 = xor %na, %B %r = xor %na, %B -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5922200TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.5923346w %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:orw: โw %v10 dsl_ret %v11 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.5922200TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.5927521w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v5; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โBโ) let x_2 โ some (Bitvec.ofInt' wโ โAโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) let x_4 โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.or (Bitvec.and x x_1) (Bitvec.xor (Bitvec.xor x_2 x_3) x_4))) = do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let snd โ some (Bitvec.ofInt' wโ โBโ) pure (Bitvec.xor (Bitvec.xor x x_1) snd)โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))) = some (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2367 -- precondition: true /- %op0 = or %A, C1 %r = or %op0, %op1 => %i = or %A, %op1 %op0 = or %A, C1 %r = or %i, C1 -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: TypeAA: โC1C1: โop1op1: โAA: โop1op1: โC1 :C1: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6149719TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โC1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orC1: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โop1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:orop1: โw %v6 dsl_ret %v7 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6149719TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โop1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orop1: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:orC1: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:orw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โC1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โC1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โC1โ) let snd โ some (Bitvec.ofInt' wโ โop1โ) pure (Bitvec.or (Bitvec.or x x_1) snd)) = do let x โ some (Bitvec.ofInt' wโ โAโ) let x_1 โ some (Bitvec.ofInt' wโ โop1โ) let snd โ some (Bitvec.ofInt' wโ โC1โ) pure (Bitvec.or (Bitvec.or x x_1) snd)โ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โC1โ)) (Bitvec.ofInt' wโ โop1โ)) = some (Bitvec.or (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โop1โ)) (Bitvec.ofInt' wโ โC1โ))โ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2416 -- precondition: true /- %x = xor %nx, -1 %op0 = and %x, %y %r = xor %op0, -1 => %ny = xor %y, -1 %x = xor %nx, -1 %op0 = and %x, %y %r = or %nx, %ny -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typenxnx: โyy: โyy: โnx :nx: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6311115TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v2 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6313385w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andy: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.6311475w %v9 dsl_ret %v10 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6311115TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v2 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6316916w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v6 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.6315413w %v7; %v9 := pair:%v8 %v1; %v10 := op:andw: โw %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โnxโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โyโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.and (Bitvec.xor x x_1) x_2) snd)) = do let fst โ some (Bitvec.ofInt' wโ โnxโ) let x โ some (Bitvec.ofInt' wโ โyโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โnxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) = some (Bitvec.or (Bitvec.ofInt' wโ โnxโ) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2417 -- precondition: true /- %x = xor %nx, -1 %op0 = or %x, %y %r = xor %op0, -1 => %ny = xor %y, -1 %x = xor %nx, -1 %op0 = or %x, %y %r = and %nx, %ny -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typenxnx: โyy: โyy: โnx :nx: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6512261TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v2 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6514531w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:ory: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.6512621w %v9 dsl_ret %v10 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6512261TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v2 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6518062w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v6 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.6516559w %v7; %v9 := pair:%v8 %v1; %v10 := op:orw: โw %v9; %v11 := pair:%v5 %v4; %v12 := op:andw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โnxโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โyโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.or (Bitvec.xor x x_1) x_2) snd)) = do let fst โ some (Bitvec.ofInt' wโ โnxโ) let x โ some (Bitvec.ofInt' wโ โyโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โnxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) = some (Bitvec.and (Bitvec.ofInt' wโ โnxโ) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2429 -- precondition: true /- %op0 = and %x, %y %r = xor %op0, -1 => %nx = xor %x, -1 %ny = xor %y, -1 %op0 = and %x, %y %r = or %nx, %ny -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typexx: โyy: โxx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6713149TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andy: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.6713509w %v6 dsl_ret %v7 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6713149TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6718745w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.6717242w %v7; %v9 := pair:%v1 %v5; %v10 := op:andw: โw %v9; %v11 := pair:%v4 %v8; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โxโ) let x_1 โ some (Bitvec.ofInt' wโ โyโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.and x x_1) snd)) = do let x โ some (Bitvec.ofInt' wโ โxโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โyโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.or (Bitvec.xor x x_1) (Bitvec.xor x_2 x_3))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) = some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2430 -- precondition: true /- %op0 = or %x, %y %r = xor %op0, -1 => %nx = xor %x, -1 %ny = xor %y, -1 %op0 = or %x, %y %r = and %nx, %ny -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typexx: โyy: โxx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6910649TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:ory: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.6911009w %v6 dsl_ret %v7 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.6910649TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.6916245w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.6914742w %v7; %v9 := pair:%v1 %v5; %v10 := op:orw: โw %v9; %v11 := pair:%v4 %v8; %v12 := op:andw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โxโ) let x_1 โ some (Bitvec.ofInt' wโ โyโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.or x x_1) snd)) = do let x โ some (Bitvec.ofInt' wโ โxโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โyโ) let x_3 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and (Bitvec.xor x x_1) (Bitvec.xor x_2 x_3))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) = some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2581 (B|A)^B -> A & ~B -- precondition: true /- %op0 = or %a, %op1 %r = xor %op0, %op1 => %nop1 = xor %op1, -1 %op0 = or %a, %op1 %r = and %a, %nop1 -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โop1op1: โop1op1: โa :a: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7106903TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โop1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orop1: โw %v3; %v5 := pair:%v4 %v2; %v6 := op:xorw: โw %v5 dsl_ret %v6 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7106903TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โop1)) %v9999; %v2 := op:const (Bitvec.ofInt'op1: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7109899w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:ora: โw %v6; %v8 := pair:%v5 %v4; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โop1โ) let snd โ some (Bitvec.ofInt' wโ โop1โ) pure (Bitvec.xor (Bitvec.or x x_1) snd)) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let x โ some (Bitvec.ofInt' wโ โop1โ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.and fst (Bitvec.xor x x_1))โ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โop1โ)) (Bitvec.ofInt' wโ โop1โ)) = some (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โop1โ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2587 (B&A)^A -> ~B & A -- precondition: true /- %op0 = and %a, %op1 %r = xor %op0, %op1 => %na = xor %a, -1 %op0 = and %a, %op1 %r = and %na, %op1 -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โop1op1: โaa: โop1 :op1: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7268446TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โop1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andop1: โw %v3; %v5 := pair:%v4 %v2; %v6 := op:xorw: โw %v5 dsl_ret %v6 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7268446TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7271442w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โop1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andop1: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โop1โ) let snd โ some (Bitvec.ofInt' wโ โop1โ) pure (Bitvec.xor (Bitvec.and x x_1) snd)) = do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let snd โ some (Bitvec.ofInt' wโ โop1โ) pure (Bitvec.and (Bitvec.xor x x_1) snd)โ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โop1โ)) (Bitvec.ofInt' wโ โop1โ)) = some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โop1โ))โ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2595 -- precondition: true /- %op0 = and %a, %b %op1 = or %a, %b %r = xor %op0, %op1 => %op0 = and %a, %b %op1 = or %a, %b %r = xor %a, %b -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โbb: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7430252TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:xorw: โw %v7 dsl_ret %v8 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7430252TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:xorw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor (Bitvec.and x x_1) (Bitvec.or x_2 x_3))) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))) = some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2607 -- precondition: true /- %na = xor %a, -1 %nb = xor %b, -1 %op0 = or %a, %nb %op1 = or %na, %b %r = xor %op0, %op1 => %na = xor %a, -1 %nb = xor %b, -1 %op0 = or %a, %nb %op1 = or %na, %b %r = xor %a, %b -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โbb: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7592120TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7595196w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.7593662w %v7; %v9 := pair:%v1 %v8; %v10 := op:orw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:orw: โw %v11; %v13 := pair:%v10 %v12; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7592120TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7599109w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.7597606w %v7; %v9 := pair:%v1 %v8; %v10 := op:orw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:orw: โw %v11; %v13 := pair:%v1 %v5; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โaโ) let x_4 โ some (Bitvec.ofInt' wโ (-1)) let x_5 โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor (Bitvec.or x (Bitvec.xor x_1 x_2)) (Bitvec.or (Bitvec.xor x_3 x_4) x_5))) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โbโ))) = some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2617 -- precondition: true /- %na = xor %a, -1 %nb = xor %b, -1 %op0 = and %a, %nb %op1 = and %na, %b %r = xor %op0, %op1 => %na = xor %a, -1 %nb = xor %b, -1 %op0 = and %a, %nb %op1 = and %na, %b %r = xor %a, %b -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โbb: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7835763TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7838839w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.7837305w %v7; %v9 := pair:%v1 %v8; %v10 := op:andw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:andw: โw %v11; %v13 := pair:%v10 %v12; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.7835763TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.7842752w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.7841249w %v7; %v9 := pair:%v1 %v8; %v10 := op:andw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:andw: โw %v11; %v13 := pair:%v1 %v5; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โaโ) let x_4 โ some (Bitvec.ofInt' wโ (-1)) let x_5 โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor (Bitvec.and x (Bitvec.xor x_1 x_2)) (Bitvec.and (Bitvec.xor x_3 x_4) x_5))) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โbโ))) = some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2627 -- precondition: true /- %op0 = xor %a, %c %op1 = or %a, %b %r = xor %op0, %op1 => %na = xor %a, -1 %and = and %na, %b %op0 = xor %a, %c %op1 = or %a, %b %r = xor %and, %c -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โcc: โbb: โaa: โbb: โc :c: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8078140TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โc)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorc: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:orb: โw %v6; %v8 := pair:%v4 %v7; %v9 := op:xorw: โw %v8 dsl_ret %v9 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8078140TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.8083600w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andb: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (w: โc)) %v9999; %v9 := pair:%v1 %v8; %v10 := op:xorc: โw %v9; %v11 := pair:%v1 %v5; %v12 := op:orw: โw %v11; %v13 := pair:%v7 %v8; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โcโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ โcโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โcโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor (Bitvec.xor x x_1) (Bitvec.or x_2 x_3))) = do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ (-1)) let x_2 โ some (Bitvec.ofInt' wโ โbโ) let snd โ some (Bitvec.ofInt' wโ โcโ) pure (Bitvec.xor (Bitvec.and (Bitvec.xor x x_1) x_2) snd)โ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โcโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))) = some (Bitvec.xor (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โbโ)) (Bitvec.ofInt' wโ โcโ))โ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2647 -- precondition: true /- %op0 = and %a, %b %op1 = xor %a, %b %r = xor %op0, %op1 => %op0 = and %a, %b %op1 = xor %a, %b %r = or %a, %b -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typeaa: โbb: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8313380TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:xorw: โw %v7 dsl_ret %v8 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8313380TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:orw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ โaโ) let x_3 โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.xor (Bitvec.and x x_1) (Bitvec.xor x_2 x_3))) = do let fst โ some (Bitvec.ofInt' wโ โaโ) let snd โ some (Bitvec.ofInt' wโ โbโ) pure (Bitvec.or fst snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))) = some (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2658 -- precondition: true /- %nb = xor %b, -1 %op0 = and %a, %nb %na = xor %a, -1 %r = xor %op0, %na => %and = and %a, %b %nb = xor %b, -1 %op0 = and %a, %nb %na = xor %a, -1 %r = xor %and, -1 -/ open SSA EDSL in : forall (Goals accomplished! ๐w :w: โNat) (Nat: Typebb: โaa: โaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8474809TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v2 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.8477458w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:anda: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v5 %v8; %v10 := op:xor1: ?m.8475553w %v9; %v11 := pair:%v7 %v10; %v12 := op:xorw: โw %v11 dsl_ret %v12 ] =w: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.8474809TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xor1: ?m.8480349w %v6; %v8 := pair:%v1 %v7; %v9 := op:andw: โw %v8; %v10 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v11 := pair:%v1 %v10; %v12 := op:xor1: ?m.8479431w %v11; %v13 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v14 := pair:%v4 %v13; %v15 := op:xor1: ?m.8478833w %v14 dsl_ret %v15 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let x_2 โ some (Bitvec.ofInt' wโ (-1)) let x_3 โ some (Bitvec.ofInt' wโ โaโ) let x_4 โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.and x (Bitvec.xor x_1 x_2)) (Bitvec.xor x_3 x_4))) = do let x โ some (Bitvec.ofInt' wโ โaโ) let x_1 โ some (Bitvec.ofInt' wโ โbโ) let snd โ some (Bitvec.ofInt' wโ (-1)) pure (Bitvec.xor (Bitvec.and x x_1) snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1)))) = some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e = TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eGoals accomplished! ๐